{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[参考链接-唐国梁Tommy-Pytorch RNN LSTM MNIST实战案例](https://www.bilibili.com/video/BV1n54y117KK)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型1：Pytorch RNN 实现流程\n",
    "- 1. 加载数据集\n",
    "- 2. 使得数据集可迭代（每次读取一个Batch）\n",
    "- 3. 创建模型类\n",
    "- 4. 初始化模型类\n",
    "- 5. 初始化损失类\n",
    "- 6. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. 加载数据集\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torchvision.transforms as transforms\n",
    "import torchvision.datasets as datasets\n",
    "import torchvision\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 2. 下载mnist数据集\n",
    "trainsets = datasets.MNIST(root='./data', train=True, download=True, transform=transforms.ToTensor()) # 格式转换\n",
    "\n",
    "testsets = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['0 - zero', '1 - one', '2 - two', '3 - three', '4 - four', '5 - five', '6 - six', '7 - seven', '8 - eight', '9 - nine']\n"
     ]
    }
   ],
   "source": [
    "class_names = trainsets.classes # 查看类别/标签\n",
    "\n",
    "print(class_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([60000, 28, 28])\n"
     ]
    }
   ],
   "source": [
    "# 3. 查看数据集的大小shape\n",
    "\n",
    "print(trainsets.data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([60000])\n"
     ]
    }
   ],
   "source": [
    "print(trainsets.targets.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([10000, 28, 28])\n"
     ]
    }
   ],
   "source": [
    "print(testsets.data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([10000])\n"
     ]
    }
   ],
   "source": [
    "print(testsets.targets.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4.定义超参数\n",
    "BATCH_SIZE = 32 # 每批读取的数据大小\n",
    "EPOCHS = 10 # 训练10轮"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 5. 创建数据集的可迭代对象，也就是说一个batch一个batch的读取数据\n",
    "train_loader = torch.utils.data.DataLoader(dataset=trainsets, batch_size=BATCH_SIZE, shuffle=True)\n",
    "\n",
    "test_loader = torch.utils.data.DataLoader(dataset=testsets, batch_size=BATCH_SIZE, shuffle=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 查看一批batch的数据\n",
    "\n",
    "images, labels = next(iter(test_loader))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32, 1, 28, 28])\n"
     ]
    }
   ],
   "source": [
    "print(images.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([32])\n"
     ]
    }
   ],
   "source": [
    "print(labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 6. 定义函数：显示一批数据\n",
    "def imshow(inp, title=None):\n",
    "    inp = inp.numpy().transpose((1, 2, 0))\n",
    "    mean = np.array([0.485, 0.456, 0.406]) # 均值\n",
    "    std = np.array([0.229, 0.224, 0.225]) # 标准差\n",
    "    inp = std * inp + mean\n",
    "    inp = np.clip(inp, 0, 1) # 像素值限制在0-1之间\n",
    "    plt.imshow(inp)\n",
    "    if title is not None:\n",
    "        plt.title(title)\n",
    "    plt.pause(0.001)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 网格显示\n",
    "out = torchvision.utils.make_grid(images)\n",
    "\n",
    "imshow(out)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 7. 定义RNN模型        输入数据形式为图片，不需要 Embedding 层\n",
    "\n",
    "class RNN_Model(nn.Module):\n",
    "    def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):\n",
    "        super(RNN_Model, self).__init__()\n",
    "        self.hidden_dim = hidden_dim  # 隐藏层（单元）维度\n",
    "        self.layer_dim = layer_dim    # RNN 层数\n",
    "        self.rnn = nn.RNN(input_dim, hidden_dim, layer_dim, batch_first=True,nonlinearity='relu')  # batch_first=True 将中间参数调到前面\n",
    "        # 全连接层\n",
    "        self.fc = nn.Linear(hidden_dim, output_dim)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # X.shape = [input_dim, batch_size] , input_dim 可看成 Seq_len        \n",
    "        \n",
    "        # 隐藏层h shape:（layer_dim, batch_size, hidden_dim)  初始化隐藏层状态torch.zeros()\n",
    "        h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_().to(device)  # x.size(0): batch_size 大小\n",
    "        \n",
    "        # 分离隐藏状态，避免梯度爆炸\n",
    "        out, hn = self.rnn(x, h0.detach())  \n",
    "\n",
    "        # out.shpae    =   [batch_size, input_dim, hidden_dim]      torch.Size([32, 28, 100])\n",
    "        # hn.shape     =   [n_layers, batch_size, hidden_dim]        torch.Size([2, 32, 100])\n",
    "        \n",
    "        # out[:, -1, :].shape   =  [batch_size, hidden_dim]         torch.Size([32, 100])\n",
    "        \n",
    "        out = self.fc(out[:, -1, :])  # -1： 只需最后一层的状态   \n",
    "        \n",
    "        # out.shape   =  [batch_size, output_dim]   torch.Size([32, 10])\n",
    "\n",
    "        return out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 8. 初始化模型\n",
    "input_dim = 28 # 输入维度\n",
    "hidden_dim = 100 # 隐层的维度\n",
    "layer_dim = 2 # 2层RNN\n",
    "output_dim = 10 # 输出维度  10个数字的概率\n",
    "\n",
    "# 判断是否有GPU\n",
    "device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n",
    "\n",
    "\n",
    "model = RNN_Model(input_dim, hidden_dim, layer_dim, output_dim).to(device)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 9. 定义损失函数\n",
    "criterion = nn.CrossEntropyLoss()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 10. 定义优化器\n",
    "learning_rate = 0.01\n",
    "\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 11. 输出模型参数信息\n",
    "length = len(list(model.parameters()))\n",
    "length"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "参数：1\n",
      "torch.Size([100, 28])\n",
      "参数：2\n",
      "torch.Size([100, 100])\n",
      "参数：3\n",
      "torch.Size([100])\n",
      "参数：4\n",
      "torch.Size([100])\n",
      "参数：5\n",
      "torch.Size([100, 100])\n",
      "参数：6\n",
      "torch.Size([100, 100])\n",
      "参数：7\n",
      "torch.Size([100])\n",
      "参数：8\n",
      "torch.Size([100])\n",
      "参数：9\n",
      "torch.Size([10, 100])\n",
      "参数：10\n",
      "torch.Size([10])\n"
     ]
    }
   ],
   "source": [
    "# 12. 循环打印模型参数\n",
    "for i in range(length):\n",
    "    print('参数：%d'%(i+1))\n",
    "    print(list(model.parameters())[i].size())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loop : 500, Loss : 2.308270215988159, Accuracy : 16.899999618530273\n",
      "loop : 1000, Loss : 2.2800850868225098, Accuracy : 12.029999732971191\n",
      "loop : 1500, Loss : 2.2893877029418945, Accuracy : 17.93000030517578\n",
      "loop : 2000, Loss : 2.1503496170043945, Accuracy : 24.419998168945312\n",
      "loop : 2500, Loss : 1.411773681640625, Accuracy : 43.03999710083008\n",
      "loop : 3000, Loss : 0.7614249587059021, Accuracy : 65.54000091552734\n",
      "loop : 3500, Loss : 0.5612661242485046, Accuracy : 77.20999908447266\n",
      "loop : 4000, Loss : 0.41777727007865906, Accuracy : 81.58999633789062\n",
      "loop : 4500, Loss : 0.30768030881881714, Accuracy : 86.48999786376953\n",
      "loop : 5000, Loss : 0.4445784389972687, Accuracy : 87.97999572753906\n",
      "loop : 5500, Loss : 0.36869820952415466, Accuracy : 90.0999984741211\n",
      "loop : 6000, Loss : 0.526384174823761, Accuracy : 89.04999542236328\n",
      "loop : 6500, Loss : 0.12333294749259949, Accuracy : 92.49999237060547\n",
      "loop : 7000, Loss : 0.17694006860256195, Accuracy : 93.4699935913086\n",
      "loop : 7500, Loss : 0.25190532207489014, Accuracy : 93.73999786376953\n",
      "loop : 8000, Loss : 0.3146332800388336, Accuracy : 90.66999816894531\n",
      "loop : 8500, Loss : 0.1838468760251999, Accuracy : 94.69999694824219\n",
      "loop : 9000, Loss : 0.15744319558143616, Accuracy : 93.8699951171875\n",
      "loop : 9500, Loss : 0.27388864755630493, Accuracy : 94.94999694824219\n",
      "loop : 10000, Loss : 0.31929704546928406, Accuracy : 91.5\n",
      "loop : 10500, Loss : 0.03832121193408966, Accuracy : 95.94999694824219\n",
      "loop : 11000, Loss : 0.16188004612922668, Accuracy : 95.70999908447266\n",
      "loop : 11500, Loss : 0.12086731195449829, Accuracy : 96.2300033569336\n",
      "loop : 12000, Loss : 0.05953172594308853, Accuracy : 96.62000274658203\n",
      "loop : 12500, Loss : 0.18152214586734772, Accuracy : 96.5\n",
      "loop : 13000, Loss : 0.17559143900871277, Accuracy : 96.83999633789062\n",
      "loop : 13500, Loss : 0.20851758122444153, Accuracy : 96.79000091552734\n",
      "loop : 14000, Loss : 0.06552188098430634, Accuracy : 96.33000183105469\n",
      "loop : 14500, Loss : 0.16687993705272675, Accuracy : 97.22999572753906\n",
      "loop : 15000, Loss : 0.003268913133069873, Accuracy : 97.33000183105469\n",
      "loop : 15500, Loss : 0.08567311614751816, Accuracy : 96.56999969482422\n",
      "loop : 16000, Loss : 0.05265681445598602, Accuracy : 97.57999420166016\n",
      "loop : 16500, Loss : 0.23692817986011505, Accuracy : 97.0999984741211\n",
      "loop : 17000, Loss : 0.12185416370630264, Accuracy : 96.62999725341797\n",
      "loop : 17500, Loss : 0.039394211024045944, Accuracy : 97.5199966430664\n",
      "loop : 18000, Loss : 0.014881684444844723, Accuracy : 97.2699966430664\n",
      "loop : 18500, Loss : 0.03125520795583725, Accuracy : 97.63999938964844\n"
     ]
    }
   ],
   "source": [
    "# 13. 模型训练\n",
    "sequence_dim = 28 # 序列长度\n",
    "loss_list = [] # 保存loss\n",
    "accuracy_list = [] # 保存accuracy\n",
    "iteration_list = [] # 保存循环次数\n",
    "\n",
    "iter = 0 \n",
    "for epoch in range(EPOCHS):\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "        model.train() # 声明训练\n",
    "        \n",
    "        # 一个batch的数据转换为RNN的输入维度, 以train的图片数据集维度为主\n",
    "        images = images.view(-1, sequence_dim, input_dim).requires_grad_().to(device) \n",
    "        labels = labels.to(device)\n",
    "        \n",
    "        # 梯度清零（否则会不断累加）\n",
    "        optimizer.zero_grad()\n",
    "        # 前向传播\n",
    "        outputs = model(images)\n",
    "        # 计算损失\n",
    "        loss = criterion(outputs, labels)\n",
    "        # 反向传播\n",
    "        loss.backward()\n",
    "        # 更新参数\n",
    "        optimizer.step()\n",
    "        \n",
    "        # 计数器自动加1\n",
    "        iter += 1\n",
    "        \n",
    "        \n",
    "        \n",
    "        # 模型验证\n",
    "        if iter % 500 == 0:\n",
    "            model.eval() # 声明\n",
    "            # 计算验证的accuracy\n",
    "            correct = 0.0\n",
    "            total = 0.0\n",
    "            # 迭代测试集，获取数据、预测\n",
    "            for images, labels in test_loader:\n",
    "                images = images.view(-1, sequence_dim, input_dim).to(device) \n",
    "                # 模型预测\n",
    "                outputs = model(images)\n",
    "                # 获取预测概率最大值的下标\n",
    "                predict = torch.max(outputs.data, 1)[1]  # 1: axis=1, [1]: 取后面一个值\n",
    "                # 统计测试集的大小\n",
    "                total += labels.size(0)\n",
    "                # 统计判断/预测正确的数量\n",
    "                if torch.cuda.is_available():\n",
    "                    correct += (predict.cuda() == labels.cuda()).sum()\n",
    "                else:\n",
    "                    correct += (predict == labels).sum()\n",
    "            # 计算\n",
    "            accuracy = correct / total * 100\n",
    "            # 保存accuracy, loss, iteration\n",
    "            loss_list.append(loss.data)\n",
    "            accuracy_list.append(accuracy)\n",
    "            iteration_list.append(iter)\n",
    "            # 打印信息\n",
    "            print(\"loop : {}, Loss : {}, Accuracy : {}\".format(iter, loss.item(), accuracy))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化 loss\n",
    "LossList = []\n",
    "for i in  loss_list:\n",
    "    LossList.append(i.data.cpu().numpy())\n",
    "\n",
    "plt.plot(iteration_list, LossList)\n",
    "plt.xlabel('Number of Iteration')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('RNN')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化 accuracy\n",
    "accuracyList = []\n",
    "for i in accuracy_list:\n",
    "    accuracyList.append(i.data.cpu().numpy())\n",
    "\n",
    "plt.plot(iteration_list, accuracyList, color='r')\n",
    "plt.xlabel('Number of Iteration')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.title('RNN')\n",
    "plt.savefig('RNN_mnist.png')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型2：LSTM 实现流程\n",
    "- 1.加载数据集\n",
    "- 2.使得数据集可迭代（每次读取一个Batch）\n",
    "- 3.创建模型类\n",
    "- 4.初始化模型类\n",
    "- 5.初始化损失类\n",
    "- 6.训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1. 定义模型\n",
    "class LSTM_Model(nn.Module):\n",
    "    def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):\n",
    "        super(LSTM_Model, self).__init__() # 初始化父类中的构造方法\n",
    "        self.hidden_dim = hidden_dim\n",
    "        self.layer_dim = layer_dim\n",
    "        # 构建LSTM模型\n",
    "        self.lstm = nn.LSTM(input_dim, hidden_dim, layer_dim, batch_first=True)\n",
    "        # 全连接层\n",
    "        self.fc = nn.Linear(hidden_dim, output_dim)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # 初始化隐层状态全为0\n",
    "        # (layer_dim, batch_size, hidden_dim)\n",
    "        h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_().to(device)\n",
    "        \n",
    "        # 初始化cell state  c0:传送带，保存整个时间序列当中每一个时刻的输出\n",
    "        c0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_().to(device)\n",
    "        \n",
    "        # 分离隐藏状态，以免梯度爆炸\n",
    "        out, (hn, cn) = self.lstm(x, (h0.detach(), c0.detach()))\n",
    "        \n",
    "        # out.shpae    =   [batch_size, input_dim, hidden_dim]      torch.Size([32, 28, 100])\n",
    "        \n",
    "        # 只需要最后一层隐层的状态\n",
    "        out = self.fc(out[:, -1, :])\n",
    "        return out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 2. 初始化模型\n",
    "input_dim = 28 # 输入维度，图片是28X28\n",
    "hidden_dim = 100 # 隐层维度100\n",
    "layer_dim =1 # 1个隐层\n",
    "output_dim = 10 # 输出维度：10， 即0-9共十个数字\n",
    "\n",
    "model = LSTM_Model(input_dim, hidden_dim, layer_dim, output_dim).to(device)\n",
    "\n",
    "# 判断是否有GPU\n",
    "device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "参数：1\n",
      "torch.Size([400, 28])\n",
      "参数：2\n",
      "torch.Size([400, 100])\n",
      "参数：3\n",
      "torch.Size([400])\n",
      "参数：4\n",
      "torch.Size([400])\n",
      "参数：5\n",
      "torch.Size([10, 100])\n",
      "参数：6\n",
      "torch.Size([10])\n"
     ]
    }
   ],
   "source": [
    "# 3. 循环查看\n",
    "for i in range(len(list(model.parameters()))):\n",
    "    print(\"参数：%d\" %(i+1))\n",
    "    print(list(model.parameters())[i].size())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4. 初始化损失函数\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "\n",
    "# 5. 初始化优化器\n",
    "learning_rate = 0.01\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "loop : 500 Loss : 2.3089215755462646 Accuracy : 13.130000114440918\n",
      "loop : 1000 Loss : 2.3005592823028564 Accuracy : 12.039999961853027\n",
      "loop : 1500 Loss : 2.3042495250701904 Accuracy : 12.149999618530273\n",
      "loop : 2000 Loss : 2.3030600547790527 Accuracy : 11.710000038146973\n",
      "loop : 2500 Loss : 2.2950186729431152 Accuracy : 13.819999694824219\n",
      "loop : 3000 Loss : 2.291903018951416 Accuracy : 14.069999694824219\n",
      "loop : 3500 Loss : 2.289942741394043 Accuracy : 14.890000343322754\n",
      "loop : 4000 Loss : 2.3030900955200195 Accuracy : 17.170000076293945\n",
      "loop : 4500 Loss : 2.278804302215576 Accuracy : 18.329998016357422\n",
      "loop : 5000 Loss : 2.278069496154785 Accuracy : 18.940000534057617\n",
      "loop : 5500 Loss : 2.2805838584899902 Accuracy : 19.03999900817871\n",
      "loop : 6000 Loss : 2.2620158195495605 Accuracy : 19.520000457763672\n",
      "loop : 6500 Loss : 2.2219157218933105 Accuracy : 21.94999885559082\n",
      "loop : 7000 Loss : 2.185002088546753 Accuracy : 28.34000015258789\n",
      "loop : 7500 Loss : 1.8753007650375366 Accuracy : 32.040000915527344\n",
      "loop : 8000 Loss : 1.856942892074585 Accuracy : 39.34000015258789\n",
      "loop : 8500 Loss : 1.4628715515136719 Accuracy : 51.63999938964844\n",
      "loop : 9000 Loss : 1.4055277109146118 Accuracy : 59.380001068115234\n",
      "loop : 9500 Loss : 1.211899757385254 Accuracy : 68.15999603271484\n",
      "loop : 10000 Loss : 0.8430338501930237 Accuracy : 72.22000122070312\n",
      "loop : 10500 Loss : 1.2581508159637451 Accuracy : 63.31999969482422\n",
      "loop : 11000 Loss : 0.7751366496086121 Accuracy : 78.68999481201172\n",
      "loop : 11500 Loss : 0.7596480250358582 Accuracy : 82.79999542236328\n",
      "loop : 12000 Loss : 0.5037347674369812 Accuracy : 83.95999908447266\n",
      "loop : 12500 Loss : 0.4402194321155548 Accuracy : 86.80999755859375\n",
      "loop : 13000 Loss : 0.8147168159484863 Accuracy : 86.14999389648438\n",
      "loop : 13500 Loss : 0.3895101845264435 Accuracy : 87.50999450683594\n",
      "loop : 14000 Loss : 0.4068269729614258 Accuracy : 89.23999786376953\n",
      "loop : 14500 Loss : 0.5989958643913269 Accuracy : 89.69000244140625\n",
      "loop : 15000 Loss : 0.22514306008815765 Accuracy : 91.65999603271484\n",
      "loop : 15500 Loss : 0.39274653792381287 Accuracy : 91.7699966430664\n",
      "loop : 16000 Loss : 0.07593246549367905 Accuracy : 92.58999633789062\n",
      "loop : 16500 Loss : 0.4606521725654602 Accuracy : 92.8499984741211\n",
      "loop : 17000 Loss : 0.31140273809432983 Accuracy : 92.78999328613281\n",
      "loop : 17500 Loss : 0.5599056482315063 Accuracy : 93.79999542236328\n",
      "loop : 18000 Loss : 0.15486235916614532 Accuracy : 93.61000061035156\n",
      "loop : 18500 Loss : 0.06374387443065643 Accuracy : 94.50999450683594\n"
     ]
    }
   ],
   "source": [
    "# 6. 模型训练\n",
    "\n",
    "sequence_dim = 28 # 序列长度\n",
    "loss_list = [] #  保存loss\n",
    "accuracy_list = [] # 保存accuracy\n",
    "iteration_list = [] # 循环次数\n",
    "iter = 0 \n",
    "for epoch in range(EPOCHS):\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "        model.train() # 声明模型训练\n",
    "        # 一个batch的数据转换为RNN的输入维度\n",
    "        images = images.view(-1, sequence_dim, input_dim).requires_grad_().to(device)\n",
    "        labels = labels.to(device)\n",
    "        # 梯度清零（否则会不断累积）\n",
    "        optimizer.zero_grad()\n",
    "        # 前向传播\n",
    "        outputs = model(images)\n",
    "        # 计算损失\n",
    "        loss = criterion(outputs, labels)\n",
    "        # 反向传播\n",
    "        loss.backward()\n",
    "        # 更新参数\n",
    "        optimizer.step()\n",
    "        # 计算器自增\n",
    "        iter += 1\n",
    "        # 模型验证\n",
    "        if iter % 500 == 0:\n",
    "            model.eval()\n",
    "            # 计算accuracy\n",
    "            correct = 0.0\n",
    "            total = 0.0\n",
    "            # 迭代测试集\n",
    "            for images, labels in test_loader:\n",
    "                # 一个batch的数据转换为RNN的输入维度\n",
    "                images = images.view(-1, sequence_dim, input_dim).to(device)\n",
    "                # 模型预测\n",
    "                outputs = model(images)\n",
    "                # 获取预测概率最大值的下标\n",
    "                predict = torch.max(outputs.data, 1)[1]\n",
    "                # 统计label的数量\n",
    "                total += labels.size(0) # labels.size(0) = 32 ，即一个batchsize的大小\n",
    "                # 统计预测正确的数量\n",
    "                if torch.cuda.is_available():\n",
    "                    correct += (predict.cuda() == labels.cuda()).sum()\n",
    "                else:\n",
    "                    correct += (predict == labels).sum()\n",
    "            # 计算accuracy\n",
    "            accuracy = correct / total * 100\n",
    "            # 保存loss， accuracy，\n",
    "            loss_list.append(loss.data)\n",
    "            accuracy_list.append(accuracy)\n",
    "            iteration_list.append(iter)\n",
    "            # 打印信息\n",
    "            print('loop : {} Loss : {} Accuracy : {}'.format(iter, loss.item(), accuracy))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化loss\n",
    "LossList = []\n",
    "for i in  loss_list:\n",
    "    LossList.append(i.data.cpu().numpy())\n",
    "\n",
    "plt.plot(iteration_list, LossList)\n",
    "plt.xlabel('Number of Iteration')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('LSTM')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化accuracy\n",
    "accuracyList = []\n",
    "for i in accuracy_list:\n",
    "    accuracyList.append(i.data.cpu().numpy())\n",
    "\n",
    "plt.plot(iteration_list, accuracyList, color='b')\n",
    "plt.xlabel('Number of Iteration')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.title('LSTM')\n",
    "plt.savefig('LSTM_accuracy.png')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch-cv",
   "language": "python",
   "name": "pytorch-cv"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
